<?php

namespace app\payment\admin;

use app\common\builder\ZBuilder;
use app\payment\model\Mconfig as MconfigModel;
use app\payment\model\PaymentConfig as PaymentConfigModel;
use app\payment\model\PaymentPayCompany as PaymentPayCompanyModel;
use app\payment\model\PaymentPaidCompany as PaymentPaidCompanyModel;
use app\payment\model\PaymentCash as PaymentCashModel;
use app\user\model\User as UserModel;

/**
 * 商户支付配置控制器
 */
class Mconfig extends Index
{

    public $default_param = [];

    protected function initialize()
    {
        parent::initialize();
        if (!in_array(request()->action(), ['index', 'see', 'editpwd', 'googleverify'])) {
            if ($this->no_auth) {
                $this->error('权限不足！');
            }
        }

        if (in_array(request()->action(), ['add'])) {
            if (!$this->add_safe) {
                $this->error('NO');
            }
        }
        if (in_array(request()->action(), ['edit', 'info', 'company', 'companychild'])) {
            if (!$this->edit_safe) {
                $this->error('NO');
            }
        }
        if (in_array(request()->action(), ['delete'])) {
            if (!$this->delete_safe) {
                $this->error('NO');
            }
        }

        if (in_array(request()->action(), ['info'])) {
            if ($this->role > $this->have_auth) {
                $this->error('NO');
            }
        }

        // 默认参数
        $this->default_param['merchant_min_recharge_cash'] = pay_config('merchant_min_recharge_cash');
        $this->default_param['merchant_max_recharge_cash'] = pay_config('merchant_max_recharge_cash');
        $this->default_param['merchant_min_paid_cash'] = pay_config('merchant_min_paid_cash');
        $this->default_param['merchant_max_paid_cash'] = pay_config('merchant_max_paid_cash');
        $this->default_param['merchant_paid_start_price'] = pay_config('merchant_paid_start_price');
        $this->default_param['merchant_paid_rate'] = pay_config('merchant_paid_rate');
        $this->default_param['merchant_day_recharge_type_cash_sum'] = pay_config('merchant_day_recharge_type_cash_sum');
        $this->default_param['merchant_day_paid_cash_sum'] = pay_config('merchant_day_paid_cash_sum');
        $this->default_param['merchant_pay_rate'] = pay_config('merchant_pay_rate');
    }

    /**
     * 首页
     * @return mixed
     */
    public function index()
    {
        // 获取查询条件
        $map = $this->getMap();

        if ($map) {
            foreach ($map as $map_k1 => $map_v1) {
                if ($map_v1[0] == 'id') {
                    $search_merchant_id_key = $map_k1;
                    $search_merchant_id = $map[$map_k1][2];
                }
            }
        }

        $search_merchant_id_key = isset($search_merchant_id_key) ? $search_merchant_id_key : count($map);

        if ($this->no_auth) {
            $map[$search_merchant_id_key] = ['id', '=', $this->merchant_id];
        }

        if ($this->is_agent) {
            $sub_merchant = get_sub_merchant($this->merchant_id);
            if ($sub_merchant) {
                $sub_merchant[] = $this->merchant_id;
                $map[$search_merchant_id_key] = ['id', 'in', $sub_merchant];
                if (isset($search_merchant_id) && in_array($search_merchant_id, $sub_merchant)) {
                    $map[$search_merchant_id_key] = ['id', '=', $search_merchant_id];
                }
            }
        }

        $list_rows = input('list_rows', 20);
        // 数据列表
        $data_list = MconfigModel::where($map)->order('sort desc,status desc,create_time desc')->paginate($list_rows);

        // 分页数据
        $page = $data_list->render();

        // 所有的支付类型
        $all_payment_type = pay_config('payment_type');
        // 所有的交易类型
        $all_trade_type = pay_config('trade_type');

        $search = [
            ['text:3', 'id', '商户号'],
            ['select:3', 'paid_limit_open', '商户代付限制开关', '', '', ['0' => '禁用', '1' => '启用']],
            ['select:3', 'ip_limit', 'IP限制开关', '', '', ['0' => '禁用', '1' => '启用']],
            ['select:3', 'vip_user_open', 'VIP用户状态', '', '', ['0' => '禁用', '1' => '启用']],
            ['select:3', 'manual_paid', '手动代付', '', '', ['0' => '禁用', '1' => '启用']],
            ['select:3', 'agent_status', '代理状态', '', '', ['0' => '禁用', '1' => '启用']],
            ['select:3', 'status', '商户状态', '', '', ['0' => '禁用', '1' => '启用']],
        ];

        $items = [
            ['id', '商户', 'callback', function ($value) {
                return $value . '<br/>' . get_user_nickname($value);
            }, '', 'text-center'],
            ['payment_type', '支付类型', 'callback', function ($payment_type, $all_payment_type) {

                $payment_type = json_decode($payment_type, true);
                foreach ($payment_type as $value) {
                    $arr[] = $all_payment_type[$value];
                }
                $payment_type_string = implode('<br/>', $arr);

                return $payment_type_string; // 可以用$data接收到其他字段的数据
            }, $all_payment_type],
            ['trade_type', '交易类型', 'callback', function ($trade_type, $all_trade_type) {

                $trade_type = json_decode($trade_type, true);
                foreach ($trade_type as $value) {
                    $arr[] = $all_trade_type[$value];
                }
                $trade_type_string = implode('—', $arr);

                return $trade_type_string; // 可以用$data接收到其他字段的数据
            }, $all_trade_type],
            ['vip_user_open', 'VIP用户', 'status'],
            ['ip_limit', 'IP限制', 'status'],
            ['agent_status', '代理状态', 'status'],
            ['status', '商户状态', 'status'],
            ['create_time', '创建时间', 'datetime', '', 'Y-m-d H:i:s'],
            ['right_button', '操作', 'btn']
        ];
        $hideCheckbox = false;
        if ($this->no_auth) {
            // 去掉显示搜索项
            $search = [];
            // 去掉显示列
            unset($items[0]);
            unset($items[3]);
            unset($items[4]);
            unset($items[5]);
            $hideCheckbox = true;
        }
        if ($this->is_agent) {
            // 显示搜索项
            $search[] = ['text:3', 'id', '商户号'];
            // 显示列
            array_unshift($items, ['id', '商户', 'callback', function ($value) {
                return $value . '<br/>' . get_user_nickname($value);
            }, '', 'text-center']);
        }

        $right_button_editpwd = [];
        if ($this->role > $this->have_auth) {
            $right_button_editpwd = ['id' => ['<>', $this->merchant_id]];
        }
        $right_button_info = ['1' => ['=', 1]];
        if ($this->role == 1) {
            $right_button_info = [];
        }
        $right_button_googleverify = [];
        if ($this->role > $this->have_auth) {
            $right_button_googleverify = ['id' => ['<>', $this->merchant_id]];
        }

        // 交易密码不能等于123456
        $tips = '';
        if ($this->merchant_info['trade_pwd'] == md5(md5(md5('123456')))) {
            $url = url('mconfig/editpwd', "id={$this->merchant_id}");
            $tips = "您的默认交易密码是123456，请修改！<a title='点击修改' class='btn btn-primary' href='{$url}'> 点击修改！</a>";
        }

        // 使用ZBuilder快速创建数据表格
        return ZBuilder::make('table')
            ->hideCheckbox($hideCheckbox)
            ->setPageTitle('商户支付配置') // 设置页面标题
            ->setTableName('payment_merchant_config') // 设置数据表名
            ->setPrimaryKey('id') // 设置主键名为id
            ->addColumns($items)
            ->addTopButtons('add,enable,disable,delete') // 批量添加顶部按钮
            ->addRightButton('see', ['title' => '查看', 'icon' => 'fa fa-fw fa-eye', 'href' => url('see', ['id' => '__id__'])], true)
            ->addRightButton('editpwd', ['title' => '修改交易密码', 'icon' => 'fa fa-fw fa-lock', 'href' => url('editpwd', ['id' => '__id__'])], false)
            ->addRightButton('info', ['title' => '修改商户信息', 'icon' => 'fa fa-fw fa-user', 'href' => url('info', ['id' => '__id__'])], false)
            ->addRightButton('googleverify', ['title' => '谷歌身份验证', 'icon' => 'fa fa-fw fa-address-card-o', 'href' => url('googleverify', ['id' => '__id__'])], false)
            ->addRightButtons('edit,delete') // 批量添加右侧按钮
            ->addRightButton('companyconfig', ['title' => '快速配置公司', 'icon' => 'fa fa-fw fa-th-large', 'href' => url('companyconfig', ['id' => '__id__'])], true)
            ->replaceRightButton($right_button_editpwd, '', 'editpwd') // 替换右侧按钮
            ->replaceRightButton($right_button_info, '', 'info') // 替换右侧按钮
            ->replaceRightButton($right_button_googleverify, '', 'googleverify') // 替换右侧按钮
            ->setSearchArea($search) // 设置搜索区域
            ->setRowList($data_list) // 设置表格数据
            ->setPages($page) // 设置分页数据
            ->setPageTips($tips)
            ->fetch(); // 渲染页面
    }

    /**
     * 新增
     * @return mixed
     */
    public function add()
    {
        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            if (isset($data['payment_type'])) {
                $data['payment_type'] = json_encode($data['payment_type']);
            }
            if (isset($data['trade_type'])) {
                $data['trade_type'] = json_encode($data['trade_type']);
            }

            // 验证
            $result = $this->validate($data, 'Mconfig');
            // 验证失败 输出错误信息
            if (true !== $result) {
                $this->error($result);
            }

            $data['trade_pwd'] = md5(md5(md5('123456')));

            $data['manage_merchant'] = isset($data['manage_merchant']) ? json_encode($data['manage_merchant']) : '';

            $start_time = explode(':', $data['start_time']);
            $data['start_time'] = $start_time[0] * 3600 + $start_time[1] * 60 + $start_time[2];
            $end_time = explode(':', $data['end_time']);
            $data['end_time'] = $end_time[0] * 3600 + $end_time[1] * 60 + $end_time[2];
            if ($data['end_time'] < $data['start_time']) {
                $this->error('开始时间不能大于结束时间！');
            }

            if ($data['sup_merchant']) {
                $sup_merchant_find = MconfigModel::where(['id' => $data['sup_merchant'], 'agent_status' => 1])->find();
                if (!$sup_merchant_find) {
                    $this->error('上级代理商户号不存在或者上级不是代理！');
                }
            }

            // 商户钱包操作，不存在添加（开始）
            $cash_table['merchant_id'] = $data['id'];                            // 商户号
            $cash_table['status'] = 1;                                           // 状态：0禁用：1启用
            $cash_table['dates'] = date('Y-m-d H:i:s');                          // 上次统计时间
            $cash_table['create_time'] = time();                                 // 创建时间
            $cash_table['update_time'] = time();                                 // 更新时间

            $recharge_cash_info = PaymentCashModel::where(['merchant_id' => $data['id']])->field(true)->find();
            if (!$recharge_cash_info) {
                PaymentCashModel::create($cash_table);
            }
            // 商户钱包操作，不存在添加（结束）

            if ($temp = MconfigModel::create($data)) {
                // 记录行为
                action_log('payment_merchant_config_add', 'mconfig', $temp['id'], UID, json_encode($temp));
                $this->success('新增成功', url('company', ['id' => $temp['id']]));
            } else {
                $this->error('新增失败');
            }
        }

        $manage_merchant = [];
        $all_merchant = all_merchant();
        foreach ($all_merchant as $k => $v) {
            $role = UserModel::where(['merchant_id' => $k])->value('role');
            if ($role > $this->auth_role) {
                $manage_merchant[$k] = $v;
            }
        }

        // 生成密钥
        $key = md5(random(100, 0));
        $paid_key = md5(random(100, 0));
        $withdrawal_key = md5(random(100, 0));
        $items = [
            ['static', 'key', '密钥', '请勿随意修改', $key, true],
            ['static', 'withdrawal_key', '提现密钥', '请勿随意修改', $withdrawal_key, true],
            ['static', 'paid_key', '代付密钥', '请勿随意修改', $paid_key, true],
            ['select', 'id', '商户号', '', MconfigModel::getMerchantConfig()],
            ['checkbox', 'payment_type', '支付类型', '', pay_config('payment_type'), ['alipay_h5']],
            ['checkbox', 'trade_type', '交易类型', '', pay_config('trade_type'), ['consumption', 'withdrawal', 'paid']],
            ['radio', 'settlement_type', '结算类型', 'T是交易日，D是自然日', ['T', 'D'], 1],
            ['text', 'settlement_day', '结算天数', '根据结算类型和天数，存入提现余额中', 0],
            ['text', 'day_recharge_cash_sum', '商户每天最多充值金额总数', "商户每天最多充值金额总数默认为<code>{$this->default_param['merchant_day_recharge_type_cash_sum']}</code>", $this->default_param['merchant_day_recharge_type_cash_sum']],
            ['text', 'min_paid_cash', '最小代付金额', "每次最小代付金额默认为<code>{$this->default_param['merchant_min_paid_cash']}</code>", $this->default_param['merchant_min_paid_cash']],
            ['text', 'max_paid_cash', '最大代付金额', "每次最大代付金额默认为<code>{$this->default_param['merchant_max_paid_cash']}</code>", $this->default_param['merchant_max_paid_cash']],
            ['text', 'day_paid_cash_sum', '商户银行卡每天最多代付金额总数', "商户银行卡每天最多代付金额总数默认为<code>{$this->default_param['merchant_day_paid_cash_sum']}</code>", $this->default_param['merchant_day_paid_cash_sum']],
            ['text', 'day_alipay_paid_cash_sum', '商户支付宝每天最多代付金额总数', "商户支付宝每天最多代付金额总数默认为<code>{$this->default_param['merchant_day_paid_cash_sum']}</code>", $this->default_param['merchant_day_paid_cash_sum']],
            ['text', 'paid_start_price', '银行卡每次代付开始价格', '（接口代付，每次代付开始先扣除的金额）：填数字比如：<code>2</code>，用户代付任何金额，比如<code>100</code>元，先从钱包余额扣除<code>2</code>元', $this->default_param['merchant_paid_start_price']],
            ['text', 'paid_rate', '银行卡代付费率', '（接口代付）手续费（百分比）：填数字比如：<code>0.003</code>，用户代付<code>100</code>元，先从钱包余额扣除<code>0.3</code>元', $this->default_param['merchant_paid_rate']],
            ['text', 'alipay_paid_start_price', '支付宝每次代付开始价格', '（接口代付，每次代付开始先扣除的金额）：填数字比如：<code>2</code>，用户代付任何金额，比如<code>100</code>元，先从钱包余额扣除<code>2</code>元', $this->default_param['merchant_paid_start_price']],
            ['text', 'alipay_paid_rate', '支付宝代付费率', '（接口代付）手续费（百分比）：填数字比如：<code>0.003</code>，用户代付<code>100</code>元，先从钱包余额扣除<code>0.3</code>元', $this->default_param['merchant_paid_rate']],
            ['text', 'withdrawal_start_price', '每次提现开始价格', '（后台提现，每次提现开始先扣除的金额）：填数字比如：<code>2</code>，用户提现任何金额，比如<code>100</code>元，先从钱包余额扣除<code>2</code>元', 0],
            ['text', 'withdrawal_rate', '提现费率', '（后台提现）手续费（百分比）：填数字比如：<code>0.003</code>，提现<code>100</code>元，手续费是<code>0.3</code>元', 0],
            ['radio', 'status', '状态', '', ['禁用', '启用'], 1],
            ['radio', 'automatic_audit', '每天自动审核', '是否允许每天自动审核（前一天充值金额）', ['关闭', '开启'], 1],
            ['radio', 'manual_withdrawal', '手动提现', '是否允许后台手动提现', ['关闭', '开启'], 1],
            ['radio', 'alipay_withdrawal', '支付宝提现', '是否允许后台手动支付宝提现', ['关闭', '开启'], 1],
            ['radio', 'api_withdrawal', '接口提现', '是否开启api接口提现', ['关闭', '开启'], 0],
            ['radio', 'manual_paid', '手动代付', '是否允许后台手动代付', ['关闭', '开启'], 0],
            ['radio', 'manual_refund', '手动退款', '是否允许后台手动退款', ['关闭', '开启'], 0],
            ['radio', 'api_paid', '接口代付', '是否开启api接口代付', ['关闭', '开启'], 1],
            ['radio', 'paid_limit_open', '商户代付银行支付宝限制开关', '默认按天限制', ['关闭', '开启'], 0],
            ['text', 'paid_cash_limit', '商户代付银行支付宝限制金额', '默认单个银行支付宝限制10000元', 10000],
            ['radio', 'paid_transfer_open', '后台代付转账', '是否允许后台代付转账', ['关闭', '开启'], 1],
            ['radio', 'paid_green_channel_status', '代付绿色通道状态', '如果开启，不会扣除商户现有的金额（危险操作）', ['禁用', '启用'], 0],
            ['radio', 'simulation_notify', '模拟支付通知权限', '如果开启，商户有权限模拟第三方支付通知（危险操作）', ['关闭', '开启'], 0],
            ['radio', 'simulation_paid_notify', '模拟代付通知权限', '如果开启，商户有权限模拟第三方代付通知（危险操作）', ['关闭', '开启'], 0],
            ['radio', 'simulation_refund_notify', '模拟退款通知权限', '如果开启，商户有权限模拟第三方退款通知（危险操作）', ['关闭', '开启'], 0],
            ['radio', 'vip_open', '是否开启 VIP充值', '如果开启，下游识别发送优质用户', ['关闭', '开启'], 0],
            ['radio', 'vip_user_open', '是否开启 优质用户VIP充值', '如果开启，优质VIP用户可以使用优质支付通道', ['关闭', '开启'], 0],
            ['radio', 'ip_limit', '是否开启 IP限制', '成功创建多个订单不支付，加入IP黑名单', ['关闭', '开启'], 1],
            ['radio', 'agent_status', '是否是代理', '', ['不是', '是'], 0],
            ['text', 'sup_merchant', '上级代理商户号', '请勿填错（8位），没有请留空'],
            ['radio', 'company_rate_open', '是否开启 通道费率结算', '如果开启，<code>费率计算方式</code>是通道支付类型费率加商户支付类型费率的和', ['关闭', '开启'], 0],
            ['text', 'sort', '排序', '', 100],
            ['time', 'start_time', '开始时间', '', '00:00:00'],
            ['time', 'end_time', '结束时间', '', '00:00:00'],
            ['select', 'manage_merchant', '管理商户号[:请选择n个商户号]', '绑定管理指定商户号<code>空表示无限制</code>', $manage_merchant, '', 'multiple'],
            ['password', 'trade_pwd', '交易密码', '6-16位'],
        ];

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('新增') // 设置页面标题
            ->addFormItems($items)
            ->setBtnTitle(['submit' => '下一步'])
            ->fetch();
    }

    /**
     * 添加支付类型和支付公司配置和代付公司配置
     * @param string $id 商户号id
     * @return mixed
     */
    public function company($id = null)
    {
        if ($id === null) {
            $this->error('缺少参数！');
        }

        // 获取数据
        $info = MconfigModel::where('id', $id)->field(true)->find();
        unset($info['trade_pwd']);

        // 每个商户号，根据每个支付类型，最多选择多少个支付公司
        $payment_type_company_count = pay_config('payment_type_company_count');

        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            // 判断是否设置了，支付类型和支付公司配置
            if (isset($data['type_company_config'])) {

                foreach ($data['type_company_config'] as $payment_type => $all_company) {

                    // 从数组中取出系统最多对应的商户号，支付类型对应支付公司数量
                    $select_company = array_slice($all_company, 0, $payment_type_company_count);
                    $data['type_company_config'][$payment_type] = $select_company;
                }

                $data['type_company_config'] = json_encode($data['type_company_config']);
            } else {
                $this->error('请选择支付公司！');
            }

            // 判断是否设置了，VIP支付类型和支付公司配置
            if (isset($data['vip_type_company_config'])) {

                foreach ($data['vip_type_company_config'] as $payment_type => $all_company) {

                    // 从数组中取出系统最多对应的商户号，支付类型对应支付公司数量
                    $select_company = array_slice($all_company, 0, $payment_type_company_count);
                    $data['vip_type_company_config'][$payment_type] = $select_company;
                }

                $data['vip_type_company_config'] = json_encode($data['vip_type_company_config']);
            }

            // 判断是否设置银行卡代付公司配置
            if (isset($data['paid_company_configs'])) {
                $data['paid_company_config'] = json_encode($data['paid_company_configs']);
            } else {
                $data['paid_company_config'] = '';
            }

            // 判断是否设置支付宝代付公司配置
            if (isset($data['alipay_paid_company_configs'])) {
                $data['alipay_paid_company_config'] = json_encode($data['alipay_paid_company_configs']);
            } else {
                $data['alipay_paid_company_config'] = '';
            }

            // 判断是否设置支付类型费率
            if (isset($data['payment_type_rate'])) {
                $data['payment_type_rate'] = json_encode($data['payment_type_rate']);
            }

            // 判断是否设置支付类型对应支付公司轮循设置
            if (isset($data['pay_polling_open'])) {
                $data['pay_polling_open'] = json_encode($data['pay_polling_open']);
            }

            // 判断是否设置支付类型每天充值金额
            if (isset($data['day_recharge_type_cash_sum'])) {
                $data['day_recharge_type_cash_sum'] = json_encode($data['day_recharge_type_cash_sum']);
            }

            // 判断是每次最小支付金额
            if (isset($data['min_recharge_cash'])) {
                $data['min_recharge_cash'] = json_encode($data['min_recharge_cash']);
            }

            // 判断是每次最大支付金额
            if (isset($data['max_recharge_cash'])) {
                $data['max_recharge_cash'] = json_encode($data['max_recharge_cash']);
            }
            // 验证
            $result = $this->validate($data, 'Mconfig.update');
            // 验证失败 输出错误信息
            if (true !== $result) {
                $this->error($result);
            }

            $data['id'] = $info['id'];

            if (MconfigModel::update($data)) {
                $temp = MconfigModel::where(['id' => $data['id']])->find();
                // 记录行为
                action_log('payment_merchant_config_edit', 'mconfig', $temp['id'], UID, json_encode($temp));
                $this->success('编辑成功', url('companyChild', ['id' => $temp['id']]));
            } else {
                $this->error('编辑失败');
            }
        }

        // 银行卡代付公司
        $paid_company = PaymentPaidCompanyModel::where(['status' => 1, 'paid_class' => [0, 2]])->order('sort asc,name asc')->column('title', 'name');
        // 支付宝代付公司
        $alipay_paid_company = PaymentPaidCompanyModel::where(['status' => 1, 'paid_class' => [1, 2]])->order('sort asc,name asc')->column('title', 'name');

        if (!$info['payment_type']) {
            $this->error('支付类型为空！');
        }

        // 获取商户号开通哪些支付类型
        $payment_type = json_decode($info['payment_type'], true);
        // 获取商户号开通哪些交易类型
        $trade_type = json_decode($info['trade_type'], true);
        $is_paid = false;
        if (in_array('paid', $trade_type)) {
            $is_paid = true;
        }
        // 支付类型费率
        $payment_type_rate_array = json_decode($info['payment_type_rate'], true);
        // 支付类型对应支付公司轮循设置
        $pay_polling_open_array = json_decode($info['pay_polling_open'], true);
        // 每次最小支付金额
        $min_recharge_cash_array = json_decode($info['min_recharge_cash'], true);
        // 每次最大支付金额
        $max_recharge_cash_array = json_decode($info['max_recharge_cash'], true);
        // 代付配置
        $paid_company_config_array = json_decode($info['paid_company_config'], true);
        // 支付宝代付配置
        $alipay_paid_company_config_array = json_decode($info['alipay_paid_company_config'], true);
        // 商户每天最多充值类型金额总数
        $day_recharge_type_cash_sum_array = json_decode($info['day_recharge_type_cash_sum'], true);

        foreach ($payment_type as $type) {
            // 支付类型，支付公司是否提供此类型
            $map1 = [];
            $map1[] = ['name', '=', 'supply_payment_type'];
            $map1[] = ['value', 'like', '%' . $type . '%'];
            $payment_type_company[$type] = PaymentConfigModel::where($map1)->column('group');
            if (empty($payment_type_company[$type])) {
                unset($payment_type_company[$type]);
            }
        }

        // 每个支付类型，对应的哪些支付公司提供
        if (empty($payment_type_company)) {
            $this->error('选择的支付类型暂无支付公司提供！', url('index'));
        }

        $payment_type_company_usable = [];
        // 过滤支付类型中选择的支付公司已经关闭
        foreach ($payment_type_company as $key => $group) {
            foreach ($group as $value) {
                $map2 = [];
                $map2[] = ['group', '=', $value];
                $map2[] = ['name', '=', 'status'];
                $map2[] = ['value', '=', 1];
                $company_group_status = PaymentConfigModel::where($map2)->find();
                if ($company_group_status) {
                    // 开启状态的可用支付公司
                    $payment_type_company_usable[$key][] = $value;
                }
            }
        }

        // 获取配置分组信息（包括所有支付公司名称）
        $list_group = pay_config('config_group');
        // 所有的支付类型
        $all_payment_type = pay_config('payment_type');
        // 所有的交易类型
        $all_trade_type = pay_config('trade_type');

        // 支付类型和支付公司配置
        $type_company_config_array = json_decode($info['type_company_config'], true);

        $form_items = [];
        // 存在支付类型和支付公司配置，设置表单项，为拖拽排序
        foreach ($payment_type_company_usable as $payment_type_key => $company) {

            $payment_type_key_value_array = isset($type_company_config_array[$payment_type_key]) ? $type_company_config_array[$payment_type_key] : [];
            // 记录上次已经选择过的支付公司
            if ($payment_type_key_value_array) {
                foreach ($payment_type_key_value_array as $payment_type_key_value_array_value) {
                    $temp_company[] = strstr($payment_type_key_value_array_value, '_', true);
                }
                $company_edit_config = array_unique($temp_company);
            }

            $form_items[] = [
                'sortcheckbox',
                'type_company_config' . '[' . $payment_type_key . ']', //name值
                "$all_payment_type[$payment_type_key]", //标题
                "$all_payment_type[$payment_type_key]选择排序结果<code>（可以拖拽排序和取消选择，选择公司名称）</code>", //提示
                getOneTwoArray($company, $list_group), //数据项
                isset($company_edit_config) ? $company_edit_config : $company, //默认值
            ];
            if (isset($company_edit_config)) {
                unset($company_edit_config);
                unset($temp_company);
            }
        }

        // 开启了VIP充值
        if ($info['vip_open'] == 1) {

            // 支付类型和支付公司配置
            $vip_type_company_config_array = json_decode($info['vip_type_company_config'], true);

            // VIP充值存在支付类型和支付公司配置，设置表单项，为拖拽排序
            foreach ($payment_type_company_usable as $payment_type_key => $company) {

                $payment_type_key_value_array = isset($vip_type_company_config_array[$payment_type_key]) ? $vip_type_company_config_array[$payment_type_key] : [];
                // 记录上次已经选择过的支付公司
                if ($payment_type_key_value_array) {
                    foreach ($payment_type_key_value_array as $payment_type_key_value_array_value) {
                        $temp_company[] = strstr($payment_type_key_value_array_value, '_', true);
                    }
                    $company_edit_config = array_unique($temp_company);
                }

                $form_items[] = [
                    'sortcheckbox',
                    'vip_type_company_config' . '[' . $payment_type_key . ']', //name值
                    "VIP=》{$all_payment_type[$payment_type_key]}", //标题
                    "VIP充值 $all_payment_type[$payment_type_key]选择排序结果<code>（可以拖拽排序和取消选择，选择公司名称）</code>", //提示
                    getOneTwoArray($company, $list_group), //数据项
                    isset($company_edit_config) ? $company_edit_config : $company, //默认值
                ];
                if (isset($company_edit_config)) {
                    unset($company_edit_config);
                    unset($temp_company);
                }
            }
        }

        if ($is_paid) {
            // 存在银行卡代付公司配置，设置表单项，为拖拽排序
            if ($paid_company) {
                $paid_company_select = [];
                foreach ($paid_company as $key => $value) {

                    // 修改的时候，记录上次选择的银行卡代付公司
                    if (is_array($paid_company_config_array)) {
                        if (in_array($key, $paid_company_config_array)) {
                            $paid_company_select[$key] = $value;
                        }
                    }
                }

                $form_items[] = [
                    'sortcheckbox',
                    'paid_company_configs', //name值
                    '选择银行卡代付公司', //标题
                    "银行卡代付公司选择排序结果<code>（可以拖拽排序和取消选择）</code>", //提示
                    $paid_company, //数据项
                    empty($paid_company_config_array) ? array_keys($paid_company) : array_keys($paid_company_select), //默认值
                ];
            }

            // 存在支付宝代付公司配置，设置表单项，为拖拽排序
            if ($alipay_paid_company) {
                $alipay_paid_company_select = [];
                foreach ($alipay_paid_company as $key => $value) {

                    // 修改的时候，记录上次选择的支付宝代付公司
                    if (is_array($alipay_paid_company_config_array)) {
                        if (in_array($key, $alipay_paid_company_config_array)) {
                            $alipay_paid_company_select[$key] = $value;
                        }
                    }
                }

                $form_items[] = [
                    'sortcheckbox',
                    'alipay_paid_company_configs', //name值
                    '选择支付宝代付公司', //标题
                    "支付宝代付公司选择排序结果<code>（可以拖拽排序和取消选择）</code>", //提示
                    $alipay_paid_company, //数据项
                    empty($alipay_paid_company_config_array) ? array_keys($alipay_paid_company) : array_keys($alipay_paid_company_select), //默认值
                ];
            }
        }

        $payment_type_rate_msg = '比如：<code>0.05</code>，用户支付<code>100</code>元，收取手续费<code>5</code>元';
        if ($info['company_rate_open'] == 1) {
            $payment_type_rate_msg = '<code>通道费率结算已经开启</code>：比如设置：<code>0.05</code>，通道费率设置：<code>0.03</code>用户支付<code>100</code>元，收取手续费<code>8</code>元';
        }

        $payment_type_rate = [];
        // 支付类型对应的费率
        foreach ($payment_type as $key => $value) {
            $payment_type_rate[] = [
                'text',
                'payment_type_rate' . '[' . $value . ']', //name值
                "$all_payment_type[$value] 费率",
                "$payment_type_rate_msg",
                isset($payment_type_rate_array[$value]) ? $payment_type_rate_array[$value] : $this->default_param['merchant_pay_rate'],
            ];
        }

        $pay_polling_open = [];
        // 支付类型对应支付公司轮循设置
        foreach ($payment_type as $key => $value) {
            $pay_polling_open[] = [
                'radio',
                'pay_polling_open' . '[' . $value . ']', //name值
                "$all_payment_type[$value] 支付公司轮循设置",
                '开启后,选择的支付公司中随机轮循或顺序轮循',
                ['关闭轮循', '随机轮循', '顺序轮循'],
                isset($pay_polling_open_array[$value]) ? $pay_polling_open_array[$value] : 0,
            ];
        }

        $day_recharge_type_cash_sum = [];
        // 每天最多充值金额
        foreach ($payment_type as $key => $value) {
            $day_recharge_type_cash_sum[] = [
                'text',
                'day_recharge_type_cash_sum' . '[' . $value . ']', //name值
                "$all_payment_type[$value] 每天最多充值金额",
                "$all_payment_type[$value] 支付类型每天最多充值金额总数",
                isset($day_recharge_type_cash_sum_array[$value]) ? $day_recharge_type_cash_sum_array[$value] : $this->default_param['merchant_day_recharge_type_cash_sum'],
            ];
        }

        $min_recharge_cash = [];
        // 最小充值金额
        foreach ($payment_type as $key => $value) {
            $min_recharge_cash[] = [
                'text',
                'min_recharge_cash' . '[' . $value . ']', //name值
                "$all_payment_type[$value] 最小充值金额",
                '每次最小充值金额为<code>0.01</code>',
                isset($min_recharge_cash_array[$value]) ? $min_recharge_cash_array[$value] : 0.01,
            ];
        }

        $max_recharge_cash = [];
        // 最大充值金额
        foreach ($payment_type as $key => $value) {
            $max_recharge_cash[] = [
                'text',
                'max_recharge_cash' . '[' . $value . ']', //name值
                "$all_payment_type[$value] 最大充值金额",
                '每次最大充值金额为<code>10000</code>',
                isset($max_recharge_cash_array[$value]) ? $max_recharge_cash_array[$value] : 10000,
            ];
        }

        $temp = [
            ['static', 'id', '商户号', '商户名称：' . get_user_nickname($info['id']), $id, $id],
            ['checkbox', 'payment_types', '选择的支付类型', '', getOneTwoArray(json_decode($info['payment_type'], true), $all_payment_type), json_decode($info['payment_type'], true), '', 'disabled'],
            ['checkbox', 'trade_types', '选择的交易类型', '', getOneTwoArray(json_decode($info['trade_type'], true), $all_trade_type), json_decode($info['trade_type'], true), '', 'disabled'],
        ];
        $add_trade_pwd = [['password', 'trade_pwd', '交易密码', '6-16位']];
        $items = array_merge($temp, $form_items, $payment_type_rate, $pay_polling_open, $day_recharge_type_cash_sum, $min_recharge_cash, $max_recharge_cash, $add_trade_pwd);

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('编辑') // 设置页面标题
            ->setPageTips("说明：请把对应的支付类型优先选择支付公司，请选择拖拽排序，默认每个支付类型，最多保存{$payment_type_company_count}个子支付公司。")
            ->addFormItems( // 批量添加表单项
                $items
            )
            ->setFormData($info) // 设置表单数据
            ->fetch();
    }

    /**
     * 支付公司多选配置
     * @param string $id 商户号id
     * @return mixed
     */
    public function companyChild($id = null)
    {
        if ($id === null) {
            $this->error('缺少参数！');
        }

        // 获取数据
        $info = MconfigModel::where('id', $id)->field(true)->find();
        unset($info['trade_pwd']);

        // 每个商户号，根据每个支付类型，最多选择多少个支付公司
        $payment_type_company_count = pay_config('payment_type_company_count');

        // 支付类型
        $payment_types = pay_config('payment_type');

        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            // 判断是否设置了，支付类型和支付公司配置
            if (isset($data['type_company_config'])) {

                foreach ($data['type_company_config'] as $payment_type => $all_company) {

                    // 从数组中取出系统最多对应的商户号，支付类型对应支付公司数量
                    $select_company = array_slice($all_company, 0, $payment_type_company_count);
                    $data['type_company_config'][$payment_type] = $select_company;
                }

                $data['type_company_config'] = json_encode($data['type_company_config']);
            } else {
                $this->error('请选择支付公司！');
            }

            // 判断是否设置了，VIP支付类型和支付公司配置
            if (isset($data['vip_type_company_config'])) {

                foreach ($data['vip_type_company_config'] as $payment_type => $all_company) {

                    // 从数组中取出系统最多对应的商户号，支付类型对应支付公司数量
                    $select_company = array_slice($all_company, 0, $payment_type_company_count);
                    $data['vip_type_company_config'][$payment_type] = $select_company;
                }

                $data['vip_type_company_config'] = json_encode($data['vip_type_company_config']);
            }

            // 验证
            $result = $this->validate($data, 'Mconfig.update');
            // 验证失败 输出错误信息
            if (true !== $result) {
                $this->error($result);
            }

            $data['id'] = $info['id'];

            if (MconfigModel::update($data)) {
                $temp = MconfigModel::where(['id' => $data['id']])->find();
                // 记录行为
                action_log('payment_merchant_config_edit', 'mconfig', $temp['id'], UID, json_encode($temp));
                $this->success('编辑成功', url('index'));
            } else {
                $this->error('编辑失败');
            }
        }

        if (!$info['type_company_config']) {
            $this->error('支付类型和支付公司配置为空！');
        }
        if ($info['vip_open'] == 1 && !$info['vip_type_company_config']) {
            $this->error('VIP支付类型和支付公司配置为空！');
        }

        $payment_company_config_obj = new PaymentPayCompanyModel();
        // 显示所有的支付公司下的商户号的名称和标题
        $all_company_merchant = $payment_company_config_obj->column('title', 'name');

        // 获取支付类型和支付公司配置
        $type_company_config = json_decode($info['type_company_config'], true);
        foreach ($type_company_config as $payment_type => $company_name_array) {

            $temp = [];
            foreach ($company_name_array as $company_name) {

                // 支付公司对应的所有商户号
                $map1 = [];
                $map1[] = ['status', '=', 1];
                $map1[] = ['group', '=', $company_name];
                $map1[] = ['payment_type', 'like', '%' . $payment_type . '%'];
                $company_child_name = $payment_company_config_obj->where($map1)->order(['sort' => 'asc'])->column('name');
                // 选择了支付公司，但是没有对应的子公司商户号，删除
                if (empty($company_child_name)) {
                    unset($company_child_name);
                } else {
                    $temp = array_merge($temp, $company_child_name);
                }
            }
            $payment_company_merchant[$payment_type] = $temp;
        }
        // 每个支付类型，对应的哪些支付公司提供
        if (empty($payment_company_merchant)) {
            $this->error('支付公司无配置商户！', url('index'));
        }

        $form_items = [];
        // $payment_company_merchant是所有支付类型对应的支付公司下的商户号  $payment_type_name是支付类型 $all_company_name是支付公司对应的支付公司下的商户号 
        foreach ($payment_company_merchant as $payment_type_name => $all_company_name) {

            $form_items[$payment_type_name][] = [
                'sortcheckbox',
                'type_company_config' . '[' . $payment_type_name . ']', //name值
                '', //$payment_types[$payment_type_name], //标题
                "$payment_types[$payment_type_name]选择排序结果<code>（可以拖拽排序和取消选择，选择子商户公司名称）</code>", //提示
                getOneTwoArray($all_company_name, $all_company_merchant), //数据项
                $all_company_name, //默认值
            ];
        }

        if ($info['vip_open'] == 1) {

            // VIP获取支付类型和支付公司配置
            $vip_type_company_config = json_decode($info['vip_type_company_config'], true);
            foreach ($vip_type_company_config as $payment_type => $company_name_array) {

                $temp = [];
                foreach ($company_name_array as $company_name) {

                    // 支付公司对应的所有商户号
                    $map2 = [];
                    $map2[] = ['status', '=', 1];
                    $map2[] = ['group', '=', $company_name];
                    $map2[] = ['payment_type', 'like', '%' . $payment_type . '%'];
                    $company_child_name = $payment_company_config_obj->where($map2)->order(['sort' => 'asc'])->column('name');
                    // 选择了支付公司，但是没有对应的子公司商户号，删除
                    if (empty($company_child_name)) {
                        unset($company_child_name);
                    } else {
                        $temp = array_merge($temp, $company_child_name);
                    }
                }
                $payment_company_merchant[$payment_type] = $temp;
            }
            // 每个支付类型，对应的哪些支付公司提供
            if (empty($payment_company_merchant)) {
                $this->error('VIP支付公司无配置商户！', url('index'));
            }

            // $payment_company_merchant是所有支付类型对应的支付公司下的商户号  $payment_type_name是支付类型 $all_company_name是支付公司对应的支付公司下的商户号 
            foreach ($payment_company_merchant as $payment_type_name => $all_company_name) {

                $form_items[$payment_type_name][] = [
                    'sortcheckbox',
                    'vip_type_company_config' . '[' . $payment_type_name . ']', //name值
                    '', //$payment_types[$payment_type_name], //标题
                    "VIP充值 $payment_types[$payment_type_name]选择排序结果<code>（可以拖拽排序和取消选择，选择子商户公司名称）</code>", //提示
                    getOneTwoArray($all_company_name, $all_company_merchant), //数据项
                    $all_company_name, //默认值
                ];
            }
        }

        //把键值的英文变成中文
        foreach ($form_items as $key => $value) {
            $payment_type_options[$payment_types[$key]] = $value;
        }

        $items = [
            ['static', 'id', '商户号', '商户名称：' . get_user_nickname($info['id']), $id, $id],
            [
                'type' => 'group', // 分组
                $payment_type_options
            ],
            ['password', 'trade_pwd', '交易密码', '6-16位']
        ];

        // 默认全部选中
        $js = <<<EOF
            <script type="text/javascript">
$(document).ready(function(){
  $(":checkbox").attr("checked",true);
});
            </script>
EOF;

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('编辑') // 设置页面标题
            ->setPageTips("说明：请把对应的支付类型优先选择支付公司，请选择拖拽排序，默认每个支付类型，最多保存{$payment_type_company_count}个。")
            ->addFormItems( // 批量添加表单项
                $items
            )
            ->setFormData($info) // 设置表单数据
            ->setExtraJs($js)
            ->fetch();
    }

    /**
     * 编辑
     * @param string $id 商户号id
     * @return mixed
     */
    public function edit($id = null)
    {
        if ($id === null) {
            $this->error('缺少参数');
        }

        // 获取数据
        $info = MconfigModel::where('id', $id)->field(true)->find();
        if (!$info) {
            $this->error('不存在！');
        }
        unset($info['trade_pwd']);

        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            if (isset($data['payment_types'])) {
                $data['payment_type'] = json_encode($data['payment_types']);
            }
            if (isset($data['trade_types'])) {
                $data['trade_type'] = json_encode($data['trade_types']);
            }

            // 验证
            $result = $this->validate($data, 'Mconfig');
            // 验证失败 输出错误信息
            if (true !== $result) {
                $this->error($result);
            }

            $data['manage_merchant'] = isset($data['manage_merchant']) ? json_encode($data['manage_merchant']) : '';

            $start_time = explode(':', $data['start_time']);
            $data['start_time'] = $start_time[0] * 3600 + $start_time[1] * 60 + $start_time[2];
            $end_time = explode(':', $data['end_time']);
            $data['end_time'] = $end_time[0] * 3600 + $end_time[1] * 60 + $end_time[2];
            if ($data['end_time'] < $data['start_time']) {
                $this->error('开始时间不能大于结束时间！');
            }

            $data['id'] = $info['id'];

            if (MconfigModel::update($data)) {
                $temp = MconfigModel::where(['id' => $data['id']])->find();
                // 记录行为
                action_log('payment_merchant_config_edit', 'mconfig', $temp['id'], UID, json_encode($temp));
                if (isset($data['save'])) {
                    $this->success('保存成功', url('index'));
                }
                $this->success('编辑成功', url('company', ['id' => $temp['id']]));
            } else {
                $this->error('编辑失败');
            }
        }

        $info['manage_merchant'] = $info['manage_merchant'] ? json_decode($info['manage_merchant'], true) : '';

        $manage_merchant = [];
        $all_merchant = all_merchant();
        foreach ($all_merchant as $k => $v) {
            $role = UserModel::where(['merchant_id' => $k])->value('role');
            if ($role > $this->auth_role) {
                $manage_merchant[$k] = $v;
            }
        }

        $payment_type = pay_config('payment_type');
        $trade_type = pay_config('trade_type');
        date_default_timezone_set("Etc/GMT");
        $items = [
            ['static', 'id', '商户号', '商户名称：' . get_user_nickname($info['id']), $info['id'], $info['id']],
            ['text', 'key', '密钥', '请勿随便修改，会影响商户'],
            ['text', 'withdrawal_key', '提现密钥', '请勿随便修改，会影响商户'],
            ['text', 'paid_key', '代付密钥', '请勿随便修改，会影响商户'],
            ['checkbox', 'payment_types', '支付类型', '请选择支付类型', $payment_type, json_decode($info['payment_type'], true)],
            ['checkbox', 'trade_types', '交易类型', '请选择交易类型', $trade_type, json_decode($info['trade_type'], true)],
            ['radio', 'settlement_type', '结算类型', 'T是交易日，D是自然日', ['T', 'D']],
            ['text', 'settlement_day', '结算天数', '根据结算类型和天数，存入提现余额中'],
            ['text', 'day_recharge_cash_sum', '商户每天最多充值金额总数', "商户每天最多充值金额总数默认为<code>{$this->default_param['merchant_day_recharge_type_cash_sum']}</code>"],
            ['text', 'min_paid_cash', '最小代付金额', "每次最小代付金额默认为<code>{$this->default_param['merchant_min_paid_cash']}</code>"],
            ['text', 'max_paid_cash', '最大代付金额', "每次最大代付金额默认为<code>{$this->default_param['merchant_max_paid_cash']}</code>"],
            ['text', 'day_paid_cash_sum', '商户银行卡每天最多代付金额总数', "商户银行卡每天最多代付金额总数默认为<code>{$this->default_param['merchant_day_paid_cash_sum']}</code>"],
            ['text', 'day_alipay_paid_cash_sum', '商户支付宝每天最多代付金额总数', "商户支付宝每天最多代付金额总数默认为<code>{$this->default_param['merchant_day_paid_cash_sum']}</code>"],
            ['text', 'paid_start_price', '银行卡每次代付开始价格', '（接口代付，每次代付开始先扣除的金额）：填数字比如：<code>2</code>，用户代付任何金额，比如<code>100</code>元，先从钱包余额扣除<code>2</code>元', $this->default_param['merchant_paid_start_price']],
            ['text', 'paid_rate', '银行卡代付费率', '（接口代付）手续费（百分比）：填数字比如：<code>0.003</code>，用户代付<code>100</code>元，先从钱包余额扣除<code>0.3</code>元', $this->default_param['merchant_paid_rate']],
            ['text', 'alipay_paid_start_price', '支付宝每次代付开始价格', '（接口代付，每次代付开始先扣除的金额）：填数字比如：<code>2</code>，用户代付任何金额，比如<code>100</code>元，先从钱包余额扣除<code>2</code>元', $this->default_param['merchant_paid_start_price']],
            ['text', 'alipay_paid_rate', '支付宝代付费率', '（接口代付）手续费（百分比）：填数字比如：<code>0.003</code>，用户代付<code>100</code>元，先从钱包余额扣除<code>0.3</code>元', $this->default_param['merchant_paid_rate']],
            ['text', 'withdrawal_start_price', '每次提现开始价格', '（后台提现，每次提现开始先扣除的金额）：填数字比如：<code>2</code>，用户提现任何金额，比如<code>100</code>元，先从钱包余额扣除<code>2</code>元', 0],
            ['text', 'withdrawal_rate', '提现费率', '（后台提现）手续费（百分比）：填数字比如：<code>0.003</code>，提现<code>100</code>元，手续费是<code>0.3</code>元', 0],
            ['radio', 'status', '状态', '', ['禁用', '启用']],
            ['radio', 'automatic_audit', '每天自动审核', '是否允许每天自动审核（前一天充值金额）', ['关闭', '开启']],
            ['radio', 'manual_withdrawal', '手动提现', '是否允许后台手动提现', ['关闭', '开启']],
            ['radio', 'alipay_withdrawal', '支付宝提现', '是否允许后台手动支付宝提现', ['关闭', '开启']],
            ['radio', 'api_withdrawal', '接口提现', '是否开启api接口提现', ['关闭', '开启']],
            ['radio', 'manual_paid', '手动代付', '是否允许后台手动代付', ['关闭', '开启']],
            ['radio', 'manual_refund', '手动退款', '是否允许后台手动退款', ['关闭', '开启']],
            ['radio', 'api_paid', '接口代付', '是否开启api接口代付', ['关闭', '开启']],
            ['radio', 'paid_limit_open', '商户代付银行支付宝限制开关', '默认按天限制', ['关闭', '开启']],
            ['text', 'paid_cash_limit', '商户代付银行支付宝限制金额', '默认单个银行支付宝限制10000元'],
            ['radio', 'paid_transfer_open', '后台代付转账', '是否允许后台代付转账', ['关闭', '开启']],
            ['radio', 'paid_green_channel_status', '代付绿色通道状态', '如果开启，不会扣除商户现有的金额（危险操作）', ['禁用', '启用']],
            ['radio', 'simulation_notify', '模拟支付通知权限', '如果开启，商户有权限模拟第三方支付通知（危险操作）', ['关闭', '开启']],
            ['radio', 'simulation_paid_notify', '模拟代付通知权限', '如果开启，商户有权限模拟第三方代付通知（危险操作）', ['关闭', '开启']],
            ['radio', 'simulation_refund_notify', '模拟退款通知权限', '如果开启，商户有权限模拟第三方退款通知（危险操作）', ['关闭', '开启']],
            ['radio', 'vip_open', '是否开启 VIP充值', '如果开启，下游识别发送优质用户', ['关闭', '开启']],
            ['radio', 'vip_user_open', '是否开启 优质用户VIP充值', '如果开启，优质VIP用户可以使用优质支付通道', ['关闭', '开启']],
            ['radio', 'ip_limit', '是否开启 IP限制', '成功创建多个订单不支付，加入IP黑名单', ['关闭', '开启']],
            ['radio', 'agent_status', '是否是代理', '', ['不是', '是']],
            ['text', 'sup_merchant', '上级代理商户号', '请勿填错（8位），没有请留空'],
            ['radio', 'company_rate_open', '是否开启 通道费率结算', '如果开启，<code>费率计算方式</code>是通道支付类型费率加商户支付类型费率的和', ['关闭', '开启']],
            ['text', 'sort', '排序', '', 100],
            ['time', 'start_time', '开始时间', '', '00:00:00'],
            ['time', 'end_time', '结束时间', '', '00:00:00'],
            ['select', 'manage_merchant', '管理商户号[:请选择n个商户号]', '绑定管理指定商户号<code>空表示无限制</code>', $manage_merchant, $info['manage_merchant'], 'multiple'],
            ['password', 'trade_pwd', '交易密码', '6-16位'],
        ];

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('编辑') // 设置页面标题
            ->setPageTips("说明：修改商户支付配置，请格外注意。")
            ->addFormItems($items)
            ->setFormData($info) // 设置表单数据
            ->setBtnTitle(['submit' => '下一步'])
            ->addBtn('<button class="btn btn-rounded btn-success" target-form="form-builder" type="submit" name="save">保存</button>')
            ->fetch();
    }

    /**
     * 编辑交易密码
     * @param string $id 商户号id
     * @return mixed
     */
    public function editpwd($id = null)
    {
        if ($id === null) {
            $this->error('缺少参数！');
        }
        // 获取数据
        $info = MconfigModel::where('id', $id)->field(true)->find();
        if (!$info) {
            $this->error('不存在！');
        }

        if ($this->no_auth) {
            if ($this->merchant_id != $info['id']) {
                $this->error('参数错误！');
            }
        }

        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if (md5(md5(md5($data['old_pwd']))) != $info['trade_pwd']) {
                $this->error('旧交易密码不正确！');
            }

            if ($data['trade_pwd'] == '123456') {
                $this->error('新交易密码不能是123456！');
            }

            if ($data['trade_pwd'] != $data['trade_pwd_confirm'] || strlen($data['trade_pwd']) < 6 || strlen($data['trade_pwd']) > 16) {
                $this->error('交易密码位数6-16位，确认新交易密码要一样！');
            }

            if ($data['trade_pwd']) {
                $data['trade_pwd'] = md5(md5(md5($data['trade_pwd'])));
            }

            $data['id'] = $info['id'];

            if (MconfigModel::update($data)) {
                $temp = MconfigModel::where(['id' => $data['id']])->find();
                // 记录行为
                action_log('payment_merchant_config_edit', 'mconfig', $temp['id'], UID, json_encode($data['id']));
                $this->success('编辑成功', url('index'));
            } else {
                $this->error('编辑失败');
            }
        }

        unset($info['trade_pwd']);
        $items = [
            ['static', 'id', '商户号', '商户名称：' . get_user_nickname($info['id']), $info['id'], $info['id']],
            ['password', 'old_pwd', '旧交易密码', '6-16位'],
            ['password', 'trade_pwd', '新交易密码', '6-16位'],
            ['password', 'trade_pwd_confirm', '确认新交易密码', '6-16位'],
        ];

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('编辑') // 设置页面标题
            ->setPageTips("说明：修改交易密码，请格外注意。")
            ->addFormItems($items)
            ->setFormData($info) // 设置表单数据
            ->fetch();
    }

    /**
     * 编辑商户信息
     * @param string $id 商户号id
     * @return mixed
     */
    public function info($id = null)
    {
        if ($id === null) {
            $this->error('缺少参数！');
        }
        // 获取数据
        $info = MconfigModel::where('id', $id)->field(true)->find();
        if (!$info) {
            $this->error('不存在！');
        }

        if ($this->no_auth) {
            if ($this->merchant_id != $info['id']) {
                $this->error('参数错误！');
            }
        }

        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            $data['pay_ip'] = str_replace('，', ',', str_replace(' ', '', $data['pay_ip']));
            $data['withdrawal_ip'] = str_replace('，', ',', str_replace(' ', '', $data['withdrawal_ip']));
            $data['paid_ip'] = str_replace('，', ',', str_replace(' ', '', $data['paid_ip']));

            // 验证
            $result = $this->validate($data, 'Mconfig.info');
            // 验证失败 输出错误信息
            if (true !== $result) {
                $this->error($result);
            }

            $data['id'] = $info['id'];

            if (MconfigModel::update($data)) {
                $temp = MconfigModel::where(['id' => $data['id']])->find();
                // 记录行为
                action_log('payment_merchant_config_edit', 'mconfig', $temp['id'], UID, json_encode($data['id']));
                $this->success('编辑成功', url('index'));
            } else {
                $this->error('编辑失败');
            }
        }

        unset($info['trade_pwd']);
        $items = [
            ['static', 'id', '商户号', '商户名称：' . get_user_nickname($info['id']), $info['id'], $info['id']],
            ['text', 'mobile', '商户手机号', '手动代付可能需要'],
            ['text', 'email', '商户邮箱', '手动代付可能需要'],
            ['textarea', 'pay_ip', '服务端充值IP白名单', '多个IP用逗号分隔（,）<code>空表示无限制</code>'],
            ['textarea', 'withdrawal_ip', '服务端提现IP白名单', '多个IP用逗号分隔（,）<code>空表示无限制</code>'],
            ['textarea', 'paid_ip', '服务端代付IP白名单', '多个IP用逗号分隔（,）<code>空表示无限制</code>'],
            ['password', 'trade_pwd', '交易密码', '6-16位'],
        ];

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('编辑') // 设置页面标题
            ->setPageTips("说明：修改商户联系方式。")
            ->addFormItems($items)
            ->setFormData($info) // 设置表单数据
            ->fetch();
    }

    /**
     * 谷歌身份验证
     * @param string $id 商户号id
     * @return mixed
     */
    public function googleVerify($id = null)
    {
        if ($id === null) {
            $this->error('缺少参数！');
        }
        // 获取数据
        $info = MconfigModel::where('id', $id)->field(true)->find();
        if (!$info) {
            $this->error('不存在！');
        }

        if ($this->no_auth) {
            if ($this->merchant_id != $info['id']) {
                $this->error('参数错误！');
            }
        }

        $google_secret = UserModel::where(['merchant_id' => $id])->value('google_secret');

        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            if (isset($data['is_google_secret'])) {
                if ($data['google_secret'] == '') {
                    $this->error('请点击谷歌验证开关！');
                }
            }

            if ($google_secret) {
                $GoogleVerification = new \GoogleAuthenticator\Verification();
                if ($GoogleVerification->checkCode($data['google_viefty'], $google_secret)) {
                    // 验证成功
                } else {
                    $this->error('谷歌验证码：验证失败');
                }
            }

            UserModel::where(['merchant_id' => $id])->update(['google_secret' => $data['google_secret']]);

            if (MconfigModel::update($data)) {
                $temp = MconfigModel::where(['id' => $data['id']])->find();
                // 记录行为
                action_log('payment_merchant_config_edit', 'mconfig', $temp['id'], UID, json_encode($data['id']));
                $this->success('编辑成功', url('index'));
            } else {
                $this->error('编辑失败');
            }
        }

        // 开启两步验证功能
        //$generate_secret_url = plugin_url('TwoStep/Admin/generateSecret');
        $generate_secret_url = url('payment/google_verify/verification', 'get_secret=1');
        $js = <<<EOF
            <script type="text/javascript">          
        $(function(){
            $("#is_google_secret").change(function() { 
                if($('#is_google_secret').is(':checked')) {
                    $.get("{$generate_secret_url}", function(res){
                        if(res.code == 0){
                            Dolphin.notify(res.msg, 'danger');
                            $("#is_google_secret").removeAttr("checked");
                            } 
                        else {   
                            $("#google_secret").val(res.secret);
                            $("#form_group_Authenticator").after("<div class='col-xs-12'><img src='"+res.QRCode+"' id='QRCode' alt='QRCode'></div>");
             
                        }
                    });
                } else {
                    $("#google_secret").val('');
                    $("#QRCode").remove();
                }
            });
        });
            </script>
EOF;

        unset($info['trade_pwd']);
        $items = [
            ['static', 'id', '商户号', '商户名称：' . get_user_nickname($info['id']), $info['id'], $info['id']],
            ['password', 'trade_pwd', '交易密码', '6-16位'],
        ];

        // 谷歌验证
        if ($google_secret) {
            array_push($items, ['text', 'google_viefty', '谷歌验证码', '']);
            array_push($items, ['switch', 'is_google_secret', '谷歌验证', '关闭后再开启可重新生成二维码', 1]);
        } else {
            array_push($items, ['switch', 'is_google_secret', '谷歌验证', '开启后用 <code>Google Authenticator</code> 扫描二维码', 0]);
        }
        array_push($items, ['hidden', 'google_secret']);
        array_push($items, ['static', 'Authenticator', '谷歌身份验证', '软件下载地址:<br/><code>https://authy.com/download</code>']);

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('编辑') // 设置页面标题
            ->setPageTips("说明：开启登录需要谷歌身份验证。")
            ->addFormItems($items)
            ->setFormData($info) // 设置表单数据
            ->setExtraJs($js)
            ->fetch();
    }

    /**
     * 快速配置公司
     * @param string $id 商户号id
     * @return mixed
     */
    public function companyConfig($id = null)
    {
        if ($id === null) {
            $this->error('缺少参数！');
        }

        // 获取数据
        $info = MconfigModel::where('id', $id)->field(true)->find();
        if (!$info) {
            $this->error('不存在！');
        }
        unset($info['trade_pwd']);

        if ($this->no_auth) {
            if ($this->merchant_id != $info['id']) {
                $this->error('参数错误！');
            }
        }

        // 每个商户号，根据每个支付类型，最多选择多少个支付公司
        $payment_type_company_count = pay_config('payment_type_company_count');

        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            // 判断是否设置了，支付类型和支付公司配置
            if (isset($data['type_company_config'])) {

                foreach ($data['type_company_config'] as $payment_type => $all_company) {

                    // 从数组中取出系统最多对应的商户号，支付类型对应支付公司数量
                    $select_company = array_slice($all_company, 0, $payment_type_company_count);
                    $data['type_company_config'][$payment_type] = $select_company;
                }

                $data['type_company_config'] = json_encode($data['type_company_config']);
            } else {
                $this->error('请选择支付公司');
            }

            // VIP判断是否设置了，支付类型和支付公司配置
            if (isset($data['vip_type_company_config'])) {

                foreach ($data['vip_type_company_config'] as $payment_type => $all_company) {

                    // 从数组中取出系统最多对应的商户号，支付类型对应支付公司数量
                    $select_company = array_slice($all_company, 0, $payment_type_company_count);
                    $data['vip_type_company_config'][$payment_type] = $select_company;
                }

                $data['vip_type_company_config'] = json_encode($data['vip_type_company_config']);
            }

            // 判断是否设置支付类型对应支付公司轮循设置
            if (isset($data['pay_polling_open'])) {
                $data['pay_polling_open'] = json_encode($data['pay_polling_open']);
            }

            // 判断是否设置银行卡代付公司配置
            if (isset($data['paid_company_configs'])) {
                $data['paid_company_config'] = json_encode($data['paid_company_configs']);
            } else {
                $data['paid_company_config'] = '';
            }

            // 判断是否设置支付宝代付公司配置
            if (isset($data['alipay_paid_company_configs'])) {
                $data['alipay_paid_company_config'] = json_encode($data['alipay_paid_company_configs']);
            } else {
                $data['alipay_paid_company_config'] = '';
            }

            // 验证
            $result = $this->validate($data, 'Mconfig.update');
            // 验证失败 输出错误信息
            if (true !== $result) {
                $this->error($result);
            }

            $data['id'] = $info['id'];

            if (MconfigModel::update($data)) {
                $temp = MconfigModel::where(['id' => $data['id']])->find();
                // 记录行为
                action_log('payment_merchant_config_edit', 'mconfig', $temp['id'], UID, json_encode($temp));
                $this->success('编辑成功', url('index'), '_close_pop');
            } else {
                $this->error('编辑失败');
            }
        }

        if (!$info['payment_type']) {
            $this->error('支付类型为空！');
        }
        if (!$info['type_company_config']) {
            $this->error('支付类型和支付公司配置为空！');
        }
        if ($info['vip_open'] == 1 && !$info['vip_type_company_config']) {
            $this->error('VIP支付类型和支付公司配置为空！');
        }

        $payment_type = json_decode($info['payment_type'], true);

        foreach ($payment_type as $type) {
            // 支付类型，支付公司是否提供此类型
            $map1 = [];
            $map1[] = ['name', '=', 'supply_payment_type'];
            $map1[] = ['value', 'like', '%' . $type . '%'];
            $payment_type_company[$type] = PaymentConfigModel::where($map1)->column('group');
            if (empty($payment_type_company[$type])) {
                unset($payment_type_company[$type]);
            }
        }

        // 每个支付类型，对应的哪些支付公司提供
        if (empty($payment_type_company)) {
            $this->error('选择的支付类型暂无支付公司提供！', url('index'));
        }

        $payment_type_company_usable = [];
        // 过滤支付类型中选择的支付公司已经关闭
        foreach ($payment_type_company as $key => $group) {
            foreach ($group as $value) {
                $map2 = [];
                $map2[] = ['group', '=', $value];
                $map2[] = ['name', '=', 'status'];
                $map2[] = ['value', '=', 1];
                $company_group_status = PaymentConfigModel::where($map2)->find();
                if ($company_group_status) {
                    // 开启状态的可用支付公司
                    $payment_type_company_usable[$key][] = $value;
                }
            }
        }

        // 获取支付类型和支付公司配置
        $type_company_config = $payment_type_company_usable;

        $payment_company_config_obj = new PaymentPayCompanyModel();
        foreach ($type_company_config as $payment_type => $company_name_array) {

            $temp = [];
            foreach ($company_name_array as $company_name) {

                // 支付公司对应的所有商户号
                $map3 = [];
                $map3[] = ['status', '=', 1];
                $map3[] = ['group', '=', $company_name];
                $map3[] = ['payment_type', 'like', '%' . $payment_type . '%'];
                $company_child_name = $payment_company_config_obj->where($map3)->order(['sort' => 'asc'])->column('name');
                // 选择了支付公司，但是没有对应的子公司商户号，删除
                if (empty($company_child_name)) {
                    unset($company_child_name);
                } else {
                    $temp = array_merge($temp, $company_child_name);
                }
            }
            $payment_company_merchant[$payment_type] = $temp;
        }

        // 所有的支付类型
        $all_payment_type = pay_config('payment_type');

        // 显示所有的支付公司下的商户号的名称和标题
        $all_company_merchant = PaymentPayCompanyModel::column('title', 'name');

        // 获取支付类型和支付公司配置
        $now_payment_company_merchant = json_decode($info['type_company_config'], true);

        $form_items = [];
        // $payment_company_merchant是所有支付类型对应的支付公司下的商户号  $payment_type_name是支付类型 $all_company_name是支付公司对应的支付公司下的商户号 
        foreach ($payment_company_merchant as $payment_type_name => $all_company_name) {

            // 数据项排序
            $data_items = getOneTwoArray($all_company_name, $all_company_merchant);

            // 存在已经选择的子支付公司
            if (isset($now_payment_company_merchant[$payment_type_name])) {
                // 计算数组的差集
                $array_diff = array_diff(array_keys($data_items), $now_payment_company_merchant[$payment_type_name]);
                // 把存在已经选择的子支付公司放到开头               
                $array_merge = array_merge($now_payment_company_merchant[$payment_type_name], $array_diff);
                // 把一维数组变成二维（显示名称） 
                $data_items = getOneTwoArray($array_merge, $all_company_merchant);
            }

            $form_items[] = [
                'sortcheckbox',
                'type_company_config' . '[' . $payment_type_name . ']', //name值
                "$all_payment_type[$payment_type_name]", //标题
                "$all_payment_type[$payment_type_name]选择排序结果<code>（可以拖拽排序和取消选择，选择公司名称）</code>", //提示
                $data_items, //数据项
                isset($now_payment_company_merchant[$payment_type_name]) ? $now_payment_company_merchant[$payment_type_name] : '', //默认值
            ];
        }
        if ($info['vip_open'] == 1) {
            // VIP获取支付类型和支付公司配置
            $now_payment_company_merchant = json_decode($info['vip_type_company_config'], true);

            // $payment_company_merchant是所有支付类型对应的支付公司下的商户号  $payment_type_name是支付类型 $all_company_name是支付公司对应的支付公司下的商户号 
            foreach ($payment_company_merchant as $payment_type_name => $all_company_name) {

                // 数据项排序
                $data_items = getOneTwoArray($all_company_name, $all_company_merchant);

                // 存在已经选择的子支付公司
                if (isset($now_payment_company_merchant[$payment_type_name])) {
                    // 计算数组的差集
                    $array_diff = array_diff(array_keys($data_items), $now_payment_company_merchant[$payment_type_name]);
                    // 把存在已经选择的子支付公司放到开头               
                    $array_merge = array_merge($now_payment_company_merchant[$payment_type_name], $array_diff);
                    // 把一维数组变成二维（显示名称） 
                    $data_items = getOneTwoArray($array_merge, $all_company_merchant);
                }

                $form_items[] = [
                    'sortcheckbox',
                    'vip_type_company_config' . '[' . $payment_type_name . ']', //name值
                    "VIP=》$all_payment_type[$payment_type_name]", //标题
                    "VIP充值 $all_payment_type[$payment_type_name]选择排序结果<code>（可以拖拽排序和取消选择，选择公司名称）</code>", //提示
                    $data_items, //数据项
                    isset($now_payment_company_merchant[$payment_type_name]) ? $now_payment_company_merchant[$payment_type_name] : '', //默认值
                ];
            }
        }

        $pay_polling_open_array = json_decode($info['pay_polling_open'], true);
        $pay_polling_open = [];
        // 支付类型对应支付公司轮循设置
        if ($pay_polling_open_array) {
            foreach ($pay_polling_open_array as $key => $value) {
                $pay_polling_open[] = [
                    'radio',
                    'pay_polling_open' . '[' . $key . ']', //name值
                    "$all_payment_type[$key] 支付公司轮循设置",
                    '开启后,选择的支付公司中随机轮循或顺序轮循',
                    ['关闭轮循', '随机轮循', '顺序轮循'],
                    isset($pay_polling_open_array[$key]) ? $pay_polling_open_array[$key] : 0,
                ];
            }
        }

        // 银行卡代付公司
        $paid_company = PaymentPaidCompanyModel::where(['status' => 1, 'paid_class' => [0, 2]])->order('sort asc,name asc')->column('title', 'name');
        // 支付宝代付公司
        $alipay_paid_company = PaymentPaidCompanyModel::where(['status' => 1, 'paid_class' => [1, 2]])->order('sort asc,name asc')->column('title', 'name');

        // 获取商户号开通哪些交易类型
        $trade_type = json_decode($info['trade_type'], true);
        $is_paid = false;
        if (in_array('paid', $trade_type)) {
            $is_paid = true;
        }

        // 银行卡代付配置
        $paid_company_config_array = json_decode($info['paid_company_config'], true);
        // 支付宝代付配置
        $alipay_paid_company_config_array = json_decode($info['alipay_paid_company_config'], true);

        $paid_select = [];
        if ($is_paid) {
            // 存在银行卡代付配置，设置表单项，为拖拽排序
            if ($paid_company) {
                $paid_company_select = [];

                if ($paid_company_config_array) {
                    foreach ($paid_company_config_array as $value) {
                        // 修改的时候，记录上次选择的代付公司
                        $paid_company_select[$value] = isset($paid_company[$value]) ? $paid_company[$value] : PaymentPaidCompanyModel::where(['name' => $value])->value('title');
                    }
                }

                $array_diff = array_diff($paid_company, $paid_company_select);

                $select = $paid_company_select + $array_diff;

                $paid_select[] = [
                    'sortcheckbox',
                    'paid_company_configs', //name值
                    '选择银行卡代付公司', //标题
                    "银行卡代付公司选择排序结果<code>（可以拖拽排序和取消选择）</code>", //提示
                    $select, //数据项
                    empty($paid_company_config_array) ? '' : array_keys($paid_company_select), //默认值
                ];
            }

            // 存在支付宝代付配置，设置表单项，为拖拽排序
            if ($alipay_paid_company) {
                $alipay_paid_company_select = [];

                if ($alipay_paid_company_config_array) {
                    foreach ($alipay_paid_company_config_array as $value) {
                        // 修改的时候，记录上次选择的代付公司
                        $alipay_paid_company_select[$value] = isset($alipay_paid_company[$value]) ? $alipay_paid_company[$value] : PaymentPaidCompanyModel::where(['name' => $value])->value('title');
                    }
                }

                $array_diff = array_diff($alipay_paid_company, $alipay_paid_company_select);

                $select = $alipay_paid_company_select + $array_diff;

                $paid_select[] = [
                    'sortcheckbox',
                    'alipay_paid_company_configs', //name值
                    '选择支付宝代付公司', //标题
                    "支付宝代付公司选择排序结果<code>（可以拖拽排序和取消选择）</code>", //提示
                    $select, //数据项
                    empty($alipay_paid_company_config_array) ? '' : array_keys($alipay_paid_company_select), //默认值
                ];
            }
        }

        $temp = [
            ['hidden', 'id', $id],
            ['static', 'id', '商户号', '商户名称：' . get_user_nickname($info['id'])],
            ['textarea', 'type_company_configs', '程序员查看', '支付类型和支付公司配置', format_nice($info['type_company_config']), 'disabled'],
        ];
        $add_trade_pwd = [['password', 'trade_pwd', '交易密码', '6-16位']];
        $items = array_merge($temp, $form_items, $pay_polling_open, $paid_select, $add_trade_pwd);

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('快速编辑公司') // 设置页面标题
            ->setPageTips("说明：快速编辑公司")
            ->addFormItems($items)
            ->setFormData($info) // 设置表单数据
            ->fetch();
    }

    /**
     * 查看
     * @param null $id 
     * @return mixed
     */
    public function see($id = null)
    {
        if ($id === null) {
            $this->error('缺少参数！');
        }

        // 获取数据
        $info = MconfigModel::where('id', $id)->field(true)->find();
        if (!$info) {
            $this->error('不存在！');
        }

        if ($this->is_agent) {
            $sub_merchant = get_sub_merchant($this->merchant_id);
            if (in_array($info['id'], $sub_merchant)) {
                $see_auth = true;
            }
        }

        if ($this->no_auth) {
            if (!isset($see_auth) && $this->merchant_id != $info['id']) {
                $this->error('参数错误！');
            }
        }

        // 支持银行卡代付公司
        $paid_company = PaymentPaidCompanyModel::where(['paid_class' => [0, 2]])->order('sort asc,name asc')->column('title', 'name');
        // 支持支付宝代付公司
        $alipay_paid_company = PaymentPaidCompanyModel::where(['paid_class' => [1, 2]])->order('sort asc,name asc')->column('title', 'name');

        if (!$info['payment_type']) {
            $this->error('支付类型为空！');
        }
        if (!$info['type_company_config']) {
            $this->error('支付类型和支付公司配置为空！');
        }
        if ($info['vip_open'] == 1 && !$info['vip_type_company_config']) {
            $this->error('VIP支付类型和支付公司配置为空！');
        }

        // 获取支付类型和支付公司配置
        $payment_company_merchant = json_decode($info['type_company_config'], true);
        // VIP获取支付类型和支付公司配置
        $vip_payment_company_merchant = json_decode($info['vip_type_company_config'], true);
        // 获取支付类型费率
        $payment_type_rates = json_decode($info['payment_type_rate'], true);
        // 支付类型对应支付公司轮循开关
        $pay_polling_opens = json_decode($info['pay_polling_open'], true);
        // 获取商户每天最多充值类型金额总数
        $day_recharge_type_cash_sums = json_decode($info['day_recharge_type_cash_sum'], true);
        // 获取每次最小支付金额
        $min_recharge_cashs = json_decode($info['min_recharge_cash'], true);
        // 获取每次最大支付金额
        $max_recharge_cashs = json_decode($info['max_recharge_cash'], true);
        // 获取商户号开通哪些交易类型
        $trade_type = json_decode($info['trade_type'], true);
        $is_paid = false;
        if (in_array('paid', $trade_type)) {
            $is_paid = true;
        }
        // 银行卡代付公司
        $paid_company_config = json_decode($info['paid_company_config'], true);
        // 支付宝代付公司
        $alipay_paid_company_config = json_decode($info['alipay_paid_company_config'], true);

        // 所有的支付类型
        $all_payment_type = pay_config('payment_type');
        // 所有的交易类型
        $all_trade_type = pay_config('trade_type');

        // 显示所有的支付公司下的商户号的名称和标题
        $all_company_merchant = PaymentPayCompanyModel::column('title', 'name');

        $form_items = [];
        // $payment_company_merchant是所有支付类型对应的支付公司下的商户号  $payment_type_name是支付类型 $all_company_name是支付公司对应的支付公司下的商户号 
        foreach ($payment_company_merchant as $payment_type_name => $all_company_name) {

            $form_items[$payment_type_name][] = [
                'sortcheckbox',
                'type_company_config' . '[' . $payment_type_name . ']', //name值
                '', //$all_payment_type[$payment_type_name], //标题
                "$all_payment_type[$payment_type_name]<code>（选择排序结果）</code>", //提示
                getOneTwoArray($all_company_name, $all_company_merchant), //数据项
                $all_company_name, //默认值
            ];
        }
        if ($info['vip_open'] == 1) {
            // $payment_company_merchant是所有支付类型对应的支付公司下的商户号  $payment_type_name是支付类型 $all_company_name是支付公司对应的支付公司下的商户号 
            foreach ($vip_payment_company_merchant as $payment_type_name => $all_company_name) {

                $form_items[$payment_type_name][] = [
                    'sortcheckbox',
                    'type_company_config' . '[' . $payment_type_name . ']', //name值
                    '', //$all_payment_type[$payment_type_name], //标题
                    "VIP充值 $all_payment_type[$payment_type_name]<code>（选择排序结果）</code>", //提示
                    getOneTwoArray($all_company_name, $all_company_merchant), //数据项
                    $all_company_name, //默认值
                ];
            }
        }

        $paid_item = [];

        if ($is_paid) {
            // 存在银行卡代付公司配置，设置表单项，为拖拽排序
            if ($paid_company_config) {
                $paid_item[] = [
                    'sortcheckbox',
                    'paid_company_configs', //name值
                    '选择银行卡代付公司', //标题
                    "银行卡代付公司选择排序结果<code>（选择排序结果）</code>", //提示
                    getOneTwoArray($paid_company_config, $paid_company), //数据项
                    array_keys($paid_company), //默认值
                ];
            }

            // 存在支付宝代付公司配置，设置表单项，为拖拽排序
            if ($alipay_paid_company_config) {
                $paid_item[] = [
                    'sortcheckbox',
                    'alipay_paid_company_configs', //name值
                    '选择支付宝代付公司', //标题
                    "支付宝代付公司选择排序结果<code>（选择排序结果）</code>", //提示
                    getOneTwoArray($alipay_paid_company_config, $alipay_paid_company), //数据项
                    array_keys($alipay_paid_company), //默认值
                ];
            }
        }

        // 把键值的英文变成中文
        foreach ($form_items as $key => $value) {
            $payment_type_options[$all_payment_type[$key]] = $value;
        }

        $pay_polling_open = [];
        // 支付公司轮循设置
        if ($pay_polling_opens) {
            foreach ($pay_polling_opens as $key => $value) {
                $pay_polling_open[] = [
                    'radio',
                    "$key", //name值
                    "$all_payment_type[$key] 支付公司轮循设置",
                    '开启后,选择的支付公司中随机轮循或顺序轮循',
                    ['关闭轮循', '随机轮循', '顺序轮循'],
                    $value,
                    '',
                    'disabled',
                    '',
                ];
            }
        }

        $payment_type_rate_msg = '比如：<code>0.05</code>，用户支付<code>100</code>元，收取手续费<code>5</code>元';
        if ($info['company_rate_open'] == 1) {
            $payment_type_rate_msg = '<code>通道费率结算已经开启</code>：比如设置：<code>0.05</code>，通道费率设置：<code>0.03</code>用户支付<code>100</code>元，收取手续费<code>8</code>元';
        }

        $payment_type_rate = [];
        // 支付类型对应的费率
        if ($payment_type_rates) {
            foreach ($payment_type_rates as $key => $value) {
                $payment_type_rate[] = [
                    'static',
                    "$key", //name值
                    "$all_payment_type[$key] 费率",
                    "$payment_type_rate_msg",
                    $value,
                ];
            }
        }

        $day_recharge_type_cash_sum = [];
        // 每天最多充值金额
        if ($day_recharge_type_cash_sums) {
            foreach ($day_recharge_type_cash_sums as $key => $value) {
                $day_recharge_type_cash_sum[] = [
                    'static',
                    "$key", //name值
                    "$all_payment_type[$key] 每天最多充值金额",
                    "$all_payment_type[$key] 支付类型每天最多充值金额总数",
                    $value,
                ];
            }
        }

        $min_recharge_cash = [];
        // 每次最小支付金额
        if ($min_recharge_cashs) {
            foreach ($min_recharge_cashs as $key => $value) {
                $min_recharge_cash[] = [
                    'static',
                    "$key", //name值
                    "$all_payment_type[$key] 每次最小支付金额",
                    '',
                    $value,
                ];
            }
        }

        $max_recharge_cash = [];
        // 每次最大支付金额
        if ($max_recharge_cashs) {
            foreach ($max_recharge_cashs as $key => $value) {
                $max_recharge_cash[] = [
                    'static',
                    "$key", //name值
                    "$all_payment_type[$key] 每次最大支付金额",
                    '',
                    $value,
                ];
            }
        }

        if (!$this->key_see_safe) {
            $info['withdrawal_key'] = '';
            $info['paid_key'] = '';
            $info['key'] = '';
        }

        $info['manage_merchant'] = $info['manage_merchant'] ? json_decode($info['manage_merchant'], true) : '';

        $temp = [
            ['static', 'withdrawal_key', '提现密钥', '提现密钥'],
            ['static', 'paid_key', '代付密钥', '代付密钥'],
            ['radio', 'paid_green_channel_status', '代付绿色通道状态', '', ['禁用', '启用'], '', '', 'disabled'],
            ['radio', 'manual_paid', '手动代付', '是否允许后台手动代付', ['关闭', '开启'], '', '', 'disabled'],
            ['radio', 'api_paid', '接口代付', '是否开启api接口代付', ['关闭', '开启'], '', '', 'disabled'],
            ['radio', 'paid_limit_open', '商户代付银行支付宝限制开关', '默认按天限制', ['关闭', '开启'], '', '', 'disabled'],
            ['static', 'paid_cash_limit', '商户代付银行支付宝限制金额', '默认单个银行支付宝限制10000元'],
            ['radio', 'paid_transfer_open', '后台代付转账', '是否允许后台代付转账', ['关闭', '开启'], '', '', 'disabled'],
            ['static', 'paid_start_price', '银行卡每次代付开始价格', '（接口代付，每次代付开始先扣除的金额）：填数字比如：<code>2</code>，用户代付任何金额，比如<code>100</code>元，先从钱包余额扣除<code>2</code>元'],
            ['static', 'paid_rate', '银行卡代付费率', '（接口代付）手续费（百分比）：填数字比如：<code>0.003</code>，用户代付<code>100</code>元，先从钱包余额扣除<code>0.3</code>元'],
            ['static', 'alipay_paid_start_price', '支付宝每次代付开始价格', '（接口代付，每次代付开始先扣除的金额）：填数字比如：<code>2</code>，用户代付任何金额，比如<code>100</code>元，先从钱包余额扣除<code>2</code>元'],
            ['static', 'alipay_paid_rate', '支付宝代付费率', '（接口代付）手续费（百分比）：填数字比如：<code>0.003</code>，用户代付<code>100</code>元，先从钱包余额扣除<code>0.3</code>元'],
            ['static', 'day_paid_cash_sum', '商户银行卡每天最多代付金额总数', "商户银行卡每天最多代付金额总数默认为<code>{$this->default_param['merchant_day_paid_cash_sum']}</code>"],
            ['static', 'day_alipay_paid_cash_sum', '商户支付宝每天最多代付金额总数', "商户支付宝每天最多代付金额总数默认为<code>{$this->default_param['merchant_day_paid_cash_sum']}</code>"],
            ['static', 'min_paid_cash', '最小代付金额', "每次最小代付金额默认为<code>{$this->default_param['merchant_min_paid_cash']}</code>"],
            ['static', 'max_paid_cash', '最大代付金额', "每次最大代付金额默认为<code>{$this->default_param['merchant_max_paid_cash']}</code>"],
            [
                'type' => 'group', // 分组
                $payment_type_options
            ],
            ['textarea', 'type_company_configs', '程序员查看', '支付类型和支付公司配置', format_nice($info['type_company_config']), 'disabled'],
            ['radio', 'simulation_notify', '模拟支付通知权限', '如果开启，商户有权限模拟第三方支付通知（危险操作）', ['关闭', '开启'], '', '', 'disabled'],
            ['radio', 'simulation_paid_notify', '模拟代付通知权限', '如果开启，商户有权限模拟第三方代付通知（危险操作）', ['关闭', '开启'], '', '', 'disabled'],
            ['radio', 'simulation_refund_notify', '模拟退款通知权限', '如果开启，商户有权限模拟第三方退款通知（危险操作）', ['关闭', '开启'], '', '', 'disabled'],
            ['radio', 'manual_refund', '手动退款', '是否允许后台手动退款', ['关闭', '开启'], '', '', 'disabled'],
            ['radio', 'vip_open', '是否开启 VIP充值', '如果开启，下游识别发送优质用户', ['关闭', '开启'], '', '', 'disabled'],
            ['radio', 'vip_user_open', '是否开启 优质用户VIP充值', '如果开启，优质VIP用户可以使用优质支付通道', ['关闭', '开启'], '', '', 'disabled'],
            ['static', 'id', '商户号', '商户名称：' . get_user_nickname($info['id'])],
            ['static', 'key', '支付密钥', '支付密钥'],
            ['textarea', 'pay_ip', '服务端充值IP白名单[:无]', '多个IP用逗号分隔（,）<code>空表示无限制</code>', '', 'disabled', ''],
            ['textarea', 'withdrawal_ip', '服务端提现IP白名单[:无]', '多个IP用逗号分隔（,）<code>空表示无限制</code>', '', 'disabled', ''],
            ['textarea', 'paid_ip', '服务端代付IP白名单[:无]', '多个IP用逗号分隔（,）<code>空表示无限制</code>', '', 'disabled', ''],
            ['radio', 'agent_status', '是否是代理', '', ['不是', '是'], '', '', 'disabled'],
            ['static', 'sup_merchant', '上级代理商户号', '商户名称：' . get_user_nickname($info['sup_merchant'])],
            ['radio', 'ip_limit', '是否开启 IP限制', '成功创建多个订单不支付，加入IP黑名单', ['关闭', '开启'], '', '', 'disabled'],
            ['checkbox', 'payment_types', '选择的支付类型', '', getOneTwoArray(json_decode($info['payment_type'], true), $all_payment_type), json_decode($info['payment_type'], true), '', 'disabled'],
            ['checkbox', 'trade_types', '选择的交易类型', '', getOneTwoArray(json_decode($info['trade_type'], true), $all_trade_type), json_decode($info['trade_type'], true), '', 'disabled'],
            ['radio', 'company_rate_open', '是否开启 通道费率结算', '如果开启，<code>费率计算方式</code>是通道支付类型费率加商户支付类型费率的和', ['关闭', '开启'], '', '', 'disabled'],
            ['datetime', 'create_time', '创建时间', '', '', 'YYYY-MM-DD HH:mm:ss', 'disabled'],
            ['datetime', 'update_time', '更新时间', '', '', 'YYYY-MM-DD HH:mm:ss', 'disabled'],
            ['static', 'day_recharge_cash_sum', '商户每天最多充值金额总数', "商户每天最多充值金额总数默认为<code>{$this->default_param['merchant_day_recharge_type_cash_sum']}</code>"],
            ['radio', 'manual_withdrawal', '手动提现', '是否允许后台手动提现', ['关闭', '开启'], '', '', 'disabled'],
            ['radio', 'alipay_withdrawal', '支付宝提现', '是否允许后台手动支付宝提现', ['关闭', '开启'], '', '', 'disabled'],
            ['radio', 'api_withdrawal', '接口提现', '是否开启api接口提现', ['关闭', '开启'], '', '', 'disabled'],
            ['static', 'withdrawal_start_price', '每次提现开始价格', '（后台提现，每次提现开始先扣除的金额）：填数字比如：<code>2</code>，用户提现任何金额，比如<code>100</code>元，先从钱包余额扣除<code>2</code>元', 0],
            ['static', 'withdrawal_rate', '提现费率', '（后台提现）手续费（百分比）：填数字比如：<code>0.003</code>，提现<code>100</code>元，手续费是<code>0.3</code>元', 0],
            ['radio', 'status', '状态', '', ['禁用', '启用'], '', '', 'disabled'],
            ['radio', 'settlement_type', '结算类型', 'T是交易日，D是自然日', ['T', 'D'], '', '', 'disabled'],
            ['static', 'settlement_day', '结算天数', '根据结算类型和天数，存入提现余额中'],
            ['radio', 'automatic_audit', '每天自动审核', '是否允许每天自动审核（前一天充值金额）', ['关闭', '开启'], '', '', 'disabled'],
            ['select', 'manage_merchant', '管理商户号[:请选择n个商户号]', '绑定管理指定商户号<code>空表示无限制</code>', all_merchant(), $info['manage_merchant'], 'multiple'],
            ['static', 'email', '商户手机号'],
            ['static', 'email', '商户邮箱'],
        ];
        if ($this->no_auth) {
            unset($temp[2]);
            if (!$is_paid) {
                unset($temp[3]);
                unset($temp[4]);
                unset($temp[5]);
                unset($temp[6]);
                unset($temp[7]);
                unset($temp[8]);
                unset($temp[9]);
                unset($temp[10]);
                unset($temp[11]);
                unset($temp[12]);
                unset($temp[13]);
                unset($temp[14]);
                unset($temp[15]);
            }
            unset($temp[16]);
            unset($temp[17]);
            unset($temp[18]);
            unset($temp[19]);
            unset($temp[20]);
            unset($temp[21]);
            unset($temp[22]);
            $paid_item = [];
        }
        if ($this->is_agent && $this->merchant_id != $info['id']) {
            unset($temp[23]);
            unset($temp[24]);
            unset($temp[25]);
            unset($temp[26]);
            unset($temp[27]);
        }
        if ($this->role > $this->have_auth) {
            unset($temp[0]);
            unset($temp[1]);
        }

        $items = array_merge($temp, $paid_item, $payment_type_rate, $pay_polling_open, $day_recharge_type_cash_sum, $min_recharge_cash, $max_recharge_cash);

        // 默认全部选中
        $js = <<<EOF
            <script type="text/javascript">
$(document).ready(function(){
  $(":checkbox").attr("checked",true);
});
            </script>
EOF;

        return ZBuilder::make('form')
            ->setPageTitle('查看') // 设置页面标题
            ->setPageTips("说明：商户支付配置展示。")
            ->addFormItems( // 批量添加表单项
                $items
            )
            ->hideBtn('submit')
            ->setFormData($info) // 设置表单数据
            ->setExtraJs($js)
            ->fetch();
    }

    /**
     * 删除
     * @param array $record 
     * @return mixed
     */
    public function delete($record = [])
    {
        return $this->setStatus('delete');
    }

    /**
     * 启用
     * @param array $record 
     * @return mixed
     */
    public function enable($record = [])
    {
        return $this->setStatus('enable');
    }

    /**
     * 禁用
     * @param array $record 
     * @return mixed
     */
    public function disable($record = [])
    {
        return $this->setStatus('disable');
    }

    /**
     * 设置状态：删除、禁用、启用
     * @param string $type 类型：delete/enable/disable
     * @param array $record 
     * @return mixed
     */
    public function setStatus($type = '', $record = [])
    {
        $ids = $this->request->isPost() ? input('post.ids/a') : input('param.ids');
        $ids_delete = is_array($ids) ? '' : $ids;
        $data = MconfigModel::where('id', 'in', $ids)->column('id');
        return parent::setStatus($type, ['payment_merchant_config_' . $type, 'payment_merchant_config', $ids_delete, UID, implode('、', $data)]);
    }

    /**
     * 快速编辑
     * @param array $record 行为日志
     * @return mixed
     */
    public function quickEdit($record = [])
    {
        $id = input('post.pk', '');
        $field = input('post.name', '');
        $value = input('post.value', '');
        $data = MconfigModel::where('id', $id)->value($field);
        $details = '字段(' . $field . ')，原值(' . $data . ')，新值：(' . $value . ')';
        return parent::quickEdit(['payment_merchant_config_edit', 'payment_merchant_config', $id, UID, $details]);
    }
}
